home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / 42 ƒ / 42_plugin_manager.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-26  |  2.7 KB  |  165 lines  |  [TEXT/CWIE]

  1. #include "42.h"
  2. #include "42_plugin_manager.h"
  3. #include "42_plugin_ticker.h"
  4. #include "42_plugin_life.h"
  5. #include "42_plugin_clock.h"
  6. #include "42_plugin_ball.h"
  7.  
  8. forty_two_plugin_api    *plugins[] =
  9. {
  10.     &plugin_ticker,
  11.     &plugin_life,
  12.     &plugin_clock,
  13.     &plugin_ball
  14. };
  15.  
  16. static int        plugin_total = 0;
  17. static DialogPtr    plugin_dialog;
  18.  
  19. extern Boolean        gDone;
  20. extern DialogPtr    gMainDialog;
  21.  
  22. int forty_two_init(DialogPtr dialog)
  23. {
  24.     int    i;
  25.     Handle    h;
  26.     Rect    r;
  27.     short    t;
  28.     PixMap    **pix;
  29.     
  30.     plugin_dialog = dialog;
  31.     
  32.     plugin_total = sizeof(plugins) / sizeof(forty_two_plugin_api *);
  33.     if(!plugin_total) return 0;
  34.  
  35.     for(i = 0; i < plugin_total; i++)
  36.     {
  37.         SetPort(plugin_dialog);
  38.         
  39.         GetDialogItem(plugin_dialog,plugins[i]->req_dialog_item,&t,&h,&r);
  40.         
  41.         OffsetRect(&r,-r.left,-r.top);
  42.         
  43.         NewGWorld(&plugins[i]->port,32,&r,nil,nil,newDepth);
  44.         
  45.         if(!plugins[i]->port) return 0;
  46.         
  47.         pix = GetGWorldPixMap(plugins[i]->port);
  48.         
  49.         LockPixels(pix);
  50.         
  51.         plugins[i]->update = forty_two_update;
  52.  
  53.         if(plugins[i]->init) (*plugins[i]->init)();
  54.     }
  55.     
  56.     return 1;
  57. }
  58.  
  59. void forty_two_kill(void)
  60. {
  61.     int    i;
  62.  
  63.     for(i = 0; i < plugin_total; i++)
  64.     {
  65.         if(plugins[i]->kill) (*plugins[i]->kill)();
  66.         DisposeGWorld(plugins[i]->port);
  67.     }
  68.     
  69.     plugin_total = 0;
  70. }
  71.  
  72. void forty_two_thread(void)
  73. {
  74.     int    i;
  75.     
  76.     if(!forty_two_init(gMainDialog)) return;
  77.     
  78.     while(!gDone)
  79.     {
  80.         YieldToAnyThread();
  81.         
  82.         for(i = 0; i < plugin_total; i++)
  83.         {
  84.             YieldToAnyThread();
  85.             if(plugins[i]->idle1)
  86.             {
  87.                 (*plugins[i]->idle1)();
  88.                 YieldToAnyThread();
  89.             }
  90.             if(plugins[i]->idle2)
  91.             {
  92.                 (*plugins[i]->idle2)();
  93.                 YieldToAnyThread();
  94.             }
  95.         }
  96.  
  97.         YieldToAnyThread();
  98.     }
  99.     
  100.     forty_two_kill();
  101. }
  102.  
  103. void forty_two_update(forty_two_plugin_api *plugin)
  104. {
  105.     Handle    h;
  106.     Rect    rsrc,rdst;
  107.     short    t;
  108.     
  109.     if(!plugin->port) return;
  110.     
  111.     GetDialogItem(plugin_dialog,plugin->req_dialog_item,&t,&h,&rdst);
  112.     BlockMove(&rdst,&rsrc,sizeof(Rect));
  113.     OffsetRect(&rsrc,-rdst.left,-rdst.top);
  114.     
  115.     SetPort(plugin_dialog);    
  116.     CopyBits(&((GrafPtr)plugin->port)->portBits,&plugin_dialog->portBits,
  117.             &rsrc,&rdst,srcCopy,nil);
  118.     
  119.     if(plugin == &plugin_ball)
  120.     {
  121.         Rect    r;
  122.         short    t;
  123.         
  124.         GetDialogItem(plugin_dialog,plugin->req_dialog_item,&t,&h,&r);
  125.         InsetRect(&r,-1,-1);
  126.         r.right--;
  127.         FrameRect(&r);
  128.     }
  129. }
  130.  
  131. void forty_two_update_all(void)
  132. {
  133.     int    i;
  134.     
  135.     for(i = 0; i < plugin_total; i++)
  136.     {
  137.         if(plugins[i]->update) plugins[i]->update(plugins[i]);
  138.     }
  139. }
  140.  
  141. void forty_two_click(Point *pt)
  142. {
  143.     int    i;
  144.     Handle    h;
  145.     Rect    r;
  146.     short    t;
  147.     
  148.     for(i = 0; i < plugin_total; i++)
  149.     {
  150.         GetDialogItem(plugin_dialog,plugins[i]->req_dialog_item,&t,&h,&r);
  151.         if(PtInRect(*pt,&r))
  152.         {
  153.             pt->h -= r.left;
  154.             pt->v -= r.top;
  155.             (*plugins[i]->click)(pt);
  156.             pt->h++;
  157.             (*plugins[i]->click)(pt);
  158.             pt->v++;
  159.             (*plugins[i]->click)(pt);
  160.             pt->h--;
  161.             (*plugins[i]->click)(pt);
  162.             break;
  163.         }
  164.     }
  165. }